<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>Hello World</h1>
<script>
    var name = 'window'

    function Person(name) {
        this.name = name
        this.foo1 = function () {
            console.log(this.name)
        },
            this.foo2 = () => console.log(this.name),
            this.foo3 = function () {
                return function () {
                    console.log(this.name)
                }
            },
            this.foo4 = function () {
                return () => {
                    console.log(this.name)
                }
            }
    }

    var person1 = new Person('person1')
    var person2 = new Person('person2')

    person1.foo1()                          // person1      成员函数
    person1.foo1.call(person2)              // person2      成员函数，修改当前对象this为person2

    person1.foo2()                          // person1      箭头函数，是个闭包。创建这个箭头函数的时候，所处上下文中的this是person1对象
    person1.foo2.call(person2)              // person1      箭头函数，是个闭包。创建这个箭头函数的时候，所处上下文中的this是person1对象，修改箭头函数的当前对象this是没有作用的

    person1.foo3()()                        // window       function函数的当前对象默认为window
    person1.foo3.call(person2)()            // window       function函数的当前对象默认为window
    person1.foo3().call(person2)            // person2      function函数的当前对象默认为window，此时修改当前对象this为person2

    person1.foo4()()                        // person1      箭头函数，是个闭包，声明这个箭头函数时所处的上下文中，this为foo4的当前对象this，此时也就是person1
    person1.foo4.call(person2)()            // person2      箭头函数，是个闭包，声明这个箭头函数时所处的上下文中，this为foo4的当前对象this，此时也就是person2
    person1.foo4().call(person2)            // person1      修改箭头函数执行的当前对象this是无效的。

</script>
</body>
</html>